/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.fatecpg.songs.crud.facade;

import br.com.fatecpg.songs.dao.GenericDAO;
import br.com.fatecpg.songs.dao.util.DAOException;
import br.com.fatecpg.songs.dao.util.DAOFactory;
import br.com.fatecpg.songs.dao.util.HibernateSession;
import br.com.fatecpg.songs.entity.Persistent;
import br.com.fatecpg.songs.entity.User;
import br.com.fatecpg.songs.entity.util.Activable;
import br.com.fatecpg.songs.entity.util.Securable;
import br.com.fatecpg.songs.util.Constants;
import br.com.fatecpg.songs.util.FacesContextUtil;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Marcos
 * Classe para realizar "fachada" entre os DAO's e os ManagedBeans da intranet
 */
public class RegisterFacade<E extends Persistent> {
    Class<E> clazz;

    public RegisterFacade(Class<E> clazz) {
        this.clazz = clazz;
    }
    
    /* Carrega linha do banco de acordo com o ID */
    public E load() throws DAOException{
        GenericDAO dao = DAOFactory.getDAO(clazz);               
        return (E) dao.load(getId());
    }
    
    //Cadastra ou edita um registro
    public void register(Persistent persistent) throws DAOException{
        GenericDAO dao = DAOFactory.getDAO(clazz);
        if(persistent.getId() == null){
            dao.save(persistent);
        }else{
            dao.update(persistent);
        }
        HibernateSession.currentSession().flush();
        HibernateSession.currentSession().clear();
    }
    
    //Deleta um registro
    public void delete() throws DAOException{
        GenericDAO dao = DAOFactory.getDAO(clazz);       
        dao.delete(load());
    }        
    
    //retorna uma lista da atual tabela
    public List<E> list() throws DAOException{
        GenericDAO dao = DAOFactory.getDAO(clazz);       
        return dao.list();
    }
    
    //preenche o último usuário que atualizou registro e em qual hora ocorreu
    public void setUpdateInfo(Securable securable){
        securable.setUpdaterUser((User) FacesContextUtil.getFromSessionMap(Constants.USER_KEY));
        securable.setLastUpdate(new Date());
    }
    
    //ativa a conta de um usuário
    public void active() throws DAOException{
        Activable activable = (Activable) load();
        activable.active();
        register(activable);
    }
    
    //desativa a conta de um usuário
    public void deactive() throws DAOException{
        Activable activable = (Activable) load();
        activable.deactive();
        register(activable);
    }
    
    //recupera o parametro id
    private Long getId(){
        long id = Long.parseLong(FacesContextUtil.getParameter("id"));  
        return id;
    }
}
